package cn.net.springboot.lettuce;

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import redis.clients.jedis.Jedis;

/**
 * 运行时请使用 run 方式执行，否则报错
 */
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 1)
@Threads(100)
@State(Scope.Thread)
@Measurement(iterations = 10, time = 600, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class JedisStudy {
    private static final int LOOP = 1;
    private Jedis jedis;

    @Setup
    public void setup() {
        jedis = new Jedis("127.0.0.1", 7777);
        jedis.auth("123456a");
        jedis.set("a", "hello world");
    }

    @Benchmark
    public void get() {
        for (int i = 0; i < LOOP; ++i) {
            jedis.get("a");
        }
    }

    public static void main(String[] args) throws RunnerException {
        Options options = new OptionsBuilder()
                .include(JedisStudy.class.getSimpleName())
                .output("benchmark/jedis-Throughput.log")
                .forks(1)
                .build();
        new Runner(options).run();
    }
}

// @OutputTimeUnit(TimeUnit.MILLISECONDS)很容易理解，就是测试结果的单位，
// @Threads(100)是开启多少个线程测试；
// @Warmup(iterations = 1)是预热的循环次数；
// @BenchmarkMode(Mode.Throughput)是测试的模式，可以测试吞吐，延时等；
// @Measurement(iterations = 2, time = 600, timeUnit = TimeUnit.MILLISECONDS)是测试的循环次数，以及时长；
// @State(Scope.Thread)和下面的@Setup配合使用，意思是每个测试线程，都会使用独立的一个变量，这个变量就是Jedis jedis，使用@Setup所修饰的方法来做初始化。
